package com.panda.web.utils;


import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.panda.web.domain.dto.ReportDTO;
import com.panda.web.entity.commons.WebReport;
import com.panda.web.entity.wechat.WechatUser;
import com.panda.web.mapper.commons.WebReportMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.time.LocalDate;
import java.util.*;
import java.util.List;
import static org.apache.commons.io.IOUtils.toByteArray;

@Component
public class ReportPDFUtils {
    @Value("${file.upload-report-zdy}")
    private String reportZdy; //动态生成的pdf地址
    @Value("${file.upload-report-gd}")
    private String reportGD; //固定Pdf地址
    @Value("${file.upload-report-sc}")
    private String reportSC; //生成的pdf地址
    @Value("${font.font-ttf}")
    private String font; //生成的pdf地址

    @Value("${file.upload-picture-btt}")
    private String picture; //生成的pdf地址
    @Value("${file.upload-picture-beij}")
    private String pictureBj; //背景图
    @Value("${file.upload-picture-logo}")
    private String logo; //背景图

    @Autowired
    private WebReportMapper reportMapper;

    /**
     * 动态生成 PDF 文件
     */
    public synchronized Map<String, String> createDynamicPDF(ReportDTO dto) throws Exception {

        String uuid = UUID.randomUUID().toString();

        String pdfPath = reportZdy + "/" + uuid + ".pdf"; // 输出PDF路径
        Map<String, String> pdfZDY = new HashMap<>();
        pdfZDY.put("uuId", uuid);
        pdfZDY.put("path", pdfPath);
        try {
            // 1. 创建PDF文档
            Document document = new Document(PageSize.A4, 50, 30, 70, 50); // 使用A4纸张大小


            // 加载背景图片
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
            String backgroundImagePath = pictureBj; // 背景图片路径
            File backgroundFile = new File(backgroundImagePath);
            if (!backgroundFile.exists()) {
                throw new RuntimeException("背景图片文件不存在，请检查路径是否正确。");
            }
            Image backgroundImage = Image.getInstance(backgroundFile.getAbsolutePath());

            // 注册背景图片事件
            BackgroundImageEvent event = new BackgroundImageEvent(backgroundImage);
            writer.setPageEvent(event);

            document.open();
            // 2. 添加标题图片
            String titleImagePath = picture; // 图片位于服务器本地目录
            File file = new File(titleImagePath);
            if (!file.exists()) {
                System.err.println("图片文件不存在，请检查路径是否正确。");
                throw new RuntimeException("文件不存在");
            }
            try (InputStream inputStream = new FileInputStream(file)) {
                Image titleImage = Image.getInstance(inputStream.readAllBytes());
                titleImage.scaleToFit(PageSize.A4.getWidth() - 150, 80); // 调整图片大小
                titleImage.setAlignment(Element.ALIGN_LEFT);
                document.add(titleImage);
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println("无法加载标题图片，请检查路径是否正确。");
            }
            // 3. 添加换行，确保表格内容不与图片重叠
            document.add(Chunk.NEWLINE);

            // 4. 创建第一个表格，宽度为500，高度为30
            PdfPTable table1 = new PdfPTable(1); // 1列
            table1.setWidthPercentage(100); // 设置表格宽度为页面的100%

            // 加载服务器本地字体文件---------------------------------------------------------------------------------------
            String fontsBasePath = font;
            // 加载微软雅黑字体
            String msyhFontPath = fontsBasePath + "msyh.ttc";
            File msyhFontFile = new File(msyhFontPath);
            if (!msyhFontFile.exists()) {
                throw new IOException("字体文件 msyh.ttc 未找到！");
            }
            byte[] fontData;
            try (InputStream fontStream = new FileInputStream(msyhFontFile)) {
                fontData = toByteArray(fontStream);
            }
            BaseFont baseFont = BaseFont.createFont("msyh.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, fontData, null);
            BaseFont baseFontH = BaseFont.createFont("msyh.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, fontData, null);

            // 加载黑体字体（SimHei）
            String simHeiFontPath = fontsBasePath + "simhei.ttf";
            File simHeiFontFile = new File(simHeiFontPath);
            if (!simHeiFontFile.exists()) {
                throw new IOException("字体文件 simhei.ttf 未找到！");
            }
            byte[] simHeiData;
            try (InputStream simHeiStream = new FileInputStream(simHeiFontFile)) {
                simHeiData = toByteArray(simHeiStream);
            }
            BaseFont simHei = BaseFont.createFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, simHeiData, null);

            // 加载汉仪粗圆简字体（HYCuYuanJ）
            String hyCuYuanJFontPath = fontsBasePath + "HYCuYuanJ.ttf";
            File hyCuYuanJFontFile = new File(hyCuYuanJFontPath);
            if (!hyCuYuanJFontFile.exists()) {
                throw new IOException("字体文件 HYCuYuanJ.ttf 未找到！");
            }
            byte[] hyCuYuanJData;
            try (InputStream hyCuYuanJStream = new FileInputStream(hyCuYuanJFontFile)) {
                hyCuYuanJData = toByteArray(hyCuYuanJStream);
            }
            BaseFont hyCuYuanJ = BaseFont.createFont("HYCuYuanJ.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, hyCuYuanJData, null);
            // 颜色定义
            BaseColor gdColor = new BaseColor(88, 136, 194); // RGB值固定字体
            BaseColor fColor = new BaseColor(236, 243, 253); // RGB值表示动态
            BaseColor bkColor = new BaseColor(25, 91, 169); // RGB值表示动态
            BaseColor hsColor = new BaseColor(0, 0, 0); // RGB值表示动态
            BaseColor gdsjZt = new BaseColor(255, 0, 0); // RGB值表示动态
            // 创建 Font 对象

            Font fontScore = new Font(baseFont, 30, Font.NORMAL,bkColor); // 字体大小为20
            Font fontA = new Font(baseFont, 11, Font.NORMAL); // 字体大小为11
            Font fontB = new Font(baseFontH, 11, Font.BOLD,BaseColor.WHITE); // 字体大小为11，加粗
            Font simHeiFont = new Font(simHei, 18, Font.NORMAL,bkColor); // 字体大小为14
            Font hyCuYuanJFont = new Font(hyCuYuanJ, 26, Font.BOLD, BaseColor.RED); // 字体大小为26，加粗，红色




            // 11. 创建第二个表格，宽度为500，高度为150
            PdfPTable table2 = new PdfPTable(1); // 1列
            table2.setWidthPercentage(100); // 设置表格宽度为页面的100%

            // 12. 创建第二个表格的单元格
            PdfPCell cell2 = new PdfPCell();
            cell2.setFixedHeight(150); // 设置单元格高度为150
            cell2.setBorder(Rectangle.BOX); // 显示完整的边框
            cell2.setBorderColor(bkColor);
            // 13. 设置第二个表格的内容
            Paragraph paragraph = new Paragraph();
            paragraph.setAlignment(Element.ALIGN_LEFT); // 整体靠左对齐

            // 第一行：同学您好：
            Phrase line1 = new Phrase("同学您好：\n", fontA);
            paragraph.add(line1);

            // 第二行：长文本，自动换行，行间距3
            Phrase line2 = new Phrase(
                    "        经过我们对上万家央国企录用标准的分析，并结合了98位平均工作年龄在10年以上的央国企HR录用经验。这些数据经过AI就业大模型的训练后，总结出了以下量表，用以大致判断央国企的录用概率。此模型为通用模型，具体概率因地点、公司及岗位而略有差异。请根据结合自己情况，如实填写。",
                    fontA
            );
            paragraph.add(line2);
            // 设置行间距为1.5倍
            paragraph.setLeading(28);
            // 将段落添加到单元格
            cell2.addElement(paragraph);
            // 14. 将单元格添加到第二个表格
            table2.addCell(cell2);

            // 15. 将第二个表格添加到文档中
            document.add(table2);

            // 16. 创建第三个表格，用于填写个人信息
            PdfPTable table3 = new PdfPTable(6); // 6列
            table3.setWidthPercentage(100); // 设置表格宽度为页面的100%

            // 17. 设置表格的列宽比例
            float[] columnWidths = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f};
            table3.setWidths(columnWidths);

//            // 18. 添加表头---------------------------------------------------------------------------------------
//            // 创建表头单元格，设置内容为“项目”，字体加粗
//            PdfPCell headerCell = new PdfPCell(new Phrase("项目", fontB)); // 使用加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);
//
//            // 创建表头单元格，设置内容为“选项”，字体不加粗
//            headerCell = new PdfPCell(new Phrase("选项", fontA)); // 使用不加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);// 显示边框
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);
//
//            // 重复上述逻辑，添加剩余的表头单元格
//            headerCell = new PdfPCell(new Phrase("项目", fontB)); // 使用加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);
//
//            headerCell = new PdfPCell(new Phrase("选项", fontA)); // 使用不加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);
//
//            headerCell = new PdfPCell(new Phrase("项目", fontB)); // 使用加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);
//
//            headerCell = new PdfPCell(new Phrase("选项", fontA)); // 使用不加粗字体
//            headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//            headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            headerCell.setBackgroundColor(gdsjZt);
//            headerCell.setBorder(Rectangle.BOX);
//            headerCell.setBorderColor(bkColor);
//            headerCell.setFixedHeight(40); // 设置单元格高度为30
//            table3.addCell(headerCell);

            // 19. 添加动态数据行
            WechatUser user = new WechatUser();
            BeanUtils.copyProperties(dto, user);
            List<String> employmentCompetence = dto.getEmploymentCompetence();

            String[][] data = {
                    {"求职类型", user.getHuntingType(), "学历", user.getBackground(), "是否为应届", user.getStressStatus()},
                    {"年龄", user.getAge() != null ? user.getAge().toString() : "", "毕业时间", user.getGraduateTime(), "政治面貌", user.getPolitics()},
                    {"求职地点", user.getSearchLocation(), "籍贯", user.getNativePlace(), "毕业院校所在城市", user.getGraduateCity()},
                    {"毕业院校类别", user.getGraduateType(), "实习或项目经历", user.getProjectExperience() != null ? user.getProjectExperience().toString() : "", "就读专业", user.getMajor()},
                    {"语言能力4级", user.getEnglishFour(), "语言能力6级", user.getEnglishSix(), "计算机能力", user.getComputerTwo()},
                    {"技能证书", user.getSkillCertificate() != null ? user.getSkillCertificate().toString() : "", "校园实践", user.getCampusPractice() != null ? user.getCampusPractice().toString() : "", "获奖情况（含奖学金）", user.getScholarship()},
                    {"姓氏", user.getFamilyName(), "性别", user.getSex(), "联系方式", user.getPhone()}
            };

            // 遍历数据行
            // 遍历数据行
            for (String[] row : data) {
                for (int i = 0; i < row.length; i++) {
                    String cellData = row[i];
                    Font cellFont;
// 判断是否为固定数据
                    if (i % 2 == 0) { // 固定数据在偶数索引位置
                        cellFont = fontB; // 加粗字体
                    } else { // 动态数据
                        cellFont = fontA; // 不加粗字体
                    }

                    // 创建单元格，并传入正确的字体
                    PdfPCell dataCell = new PdfPCell(new Phrase(cellData != null ? cellData : "", cellFont));
                    dataCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 水平居中
                    dataCell.setVerticalAlignment(Element.ALIGN_MIDDLE);   // 垂直居中
                    dataCell.setBorder(Rectangle.BOX);                     // 显示边框
                    dataCell.setFixedHeight(40); // 设置单元格高度为30
                    dataCell.setBorderColor(bkColor);
                    // 设置背景颜色
                    if (i % 2 == 0) { // 固定数据在偶数索引位置
                        dataCell.setBackgroundColor(gdColor); // 设置背景颜色为海蓝色
                    } else { // 动态数据
                        dataCell.setBackgroundColor(fColor); // 设置背景颜色为其他颜色
                    }
                    // 将单元格添加到表格
                    table3.addCell(dataCell);
                }
            }

            // 20. 将第三个表格添加到文档中---------------------------------------------------------------------------------------
            document.add(table3);

            Integer score = dto.getScore();//个人分数
            Integer zZscore = dto.getZZscore();//笔试

// 创建字体
            Paragraph  AAAAA= new Paragraph();
            AAAAA.add(new Paragraph("\n"));  // 添加一个换行
            AAAAA.add(new Paragraph("\n"));  // 添加一个换行
            document.add(AAAAA); // 确保添加到文档中
            Paragraph zZscoreParagraph = new Paragraph("笔试测评：" + zZscore + "分", fontScore);
            zZscoreParagraph.setAlignment(Element.ALIGN_CENTER); // 设置居中对齐
            document.add(zZscoreParagraph);
// 创建第一行分数文本
            Paragraph  BBBBBB= new Paragraph();
            BBBBBB.add(new Paragraph("\n"));  // 添加一个换行
            document.add(BBBBBB); // 确保添加到文档中
            Paragraph scoreParagraph = new Paragraph("网申通过率："+score + "%", fontScore);
            scoreParagraph.setAlignment(Element.ALIGN_CENTER); // 设置居中对齐
            document.add(scoreParagraph);
// 创建第二行分数文本


            document.newPage();

// 添加logo到左上角
            try {
                Image logoImage = Image.getInstance(logo); // 使用logo路径加载图像
                logoImage.scaleToFit(100, 100); // 根据需要调整图像大小，100为宽和高的限制
                logoImage.setAbsolutePosition(55, document.getPageSize().getHeight() - 90); // 调整Y坐标，确保logo不与内容重叠
                document.add(logoImage); // 将图像添加到文档中
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println("Logo加载失败：" + e.getMessage());
            }

// 添加就业竞争力部分
            Paragraph competitiveness = new Paragraph("一、 就业竞争力\n", simHeiFont);
// 不设置居中对齐
//competitiveness.setAlignment(Element.ALIGN_CENTER); // 不让标题居中

            competitiveness.add(new Paragraph("\n"));  // 添加一个换行
            competitiveness.add(new Paragraph("\n"));  // 添加一个换行

            float leading = 50f; // 行间距，可以根据需要调整
            competitiveness.setLeading(leading);

// 动态生成优势文本，并为每个优势随机设置颜色
            Paragraph lineParagraph = new Paragraph(); // 用于存放每行的优势
            int count = 0;  // 计数器，用于计算已添加的优势数量
            for (String advantage : employmentCompetence) {
                // 生成随机颜色
                BaseColor randomColor = getRandomColor();

                // 创建字体对象，使用随机颜色
                Font randomColorFont = new Font(hyCuYuanJFont.getBaseFont(), hyCuYuanJFont.getSize(), hyCuYuanJFont.getStyle(), randomColor);

                // 添加每个优势，使用随机颜色的字体
                lineParagraph.add(new Phrase(advantage + " ", randomColorFont));

                count++;  // 增加计数器

                // 每添加三个优势后添加换行符并将当前行段落添加到竞争力段落中
                if (count % 3 == 0) {
                    lineParagraph.setAlignment(Element.ALIGN_CENTER); // 仅当前行段落居中
                    competitiveness.add(lineParagraph);  // 将当前行段落添加到竞争力段落中
                    competitiveness.add(new Chunk("\n"));  // 添加换行
                    lineParagraph = new Paragraph(); // 重置行段落
                }
            }

// 如果最后一行不足三个优势，则将其添加
            if (lineParagraph.size() > 0) {
                lineParagraph.setAlignment(Element.ALIGN_CENTER); // 设置最后一行段落居中
                competitiveness.add(lineParagraph);  // 将最后一行添加到竞争力段落中
            }
            competitiveness.add(new Paragraph("\n"));  // 添加一个换行
            document.add(competitiveness); // 确保添加到文档中

// 22. 添加就业提升建议部分---------------------------------------------------------------------------------------
            Paragraph suggestions = new Paragraph("二、就业提升建议\n", simHeiFont);
            suggestions.add(new Paragraph("\n"));  // 添加一个换行

            List<String> proposal = dto.getProposal();
// 动态生成建议并添加序号
            for (int i = 0; i < proposal.size(); i++) {
                // 设置动态数据的颜色
                String suggestion = (i + 1) + "、 " + proposal.get(i) + "\n";
                Font dynamicFont = new Font(baseFont, 14, Font.NORMAL, hsColor); // 设置
                suggestions.add(new Phrase(suggestion, dynamicFont));
            }
// 将段落添加到文档中
            document.add(suggestions);

// 23. 关闭文档
            document.close();

        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("PDF生成失败：" + e.getMessage());
        }
        return pdfZDY;
}

        /**
         * 合并pdf报告
         * @param pathMap
         */
    public String hBPDF(Map<String, String> pathMap,ReportDTO dto) {
        WebReport report = new WebReport();

        // 参数校验
        if (pathMap == null || !pathMap.containsKey("path")) {
            throw new IllegalArgumentException("pathMap 不能为空且必须包含 'path' 键");
        }

        String path = pathMap.get("path");
        if (path == null || path.isEmpty()) {
            throw new IllegalArgumentException("路径不能为空");
        }

        String dynamicPdfPath = path; // 动态生成的 PDF 路径
        String fixedPdfPath = reportGD + "/" + "gdzdlmb.pdf"; // 固定数据的 PDF 路径

        // 获取当前日期，用于创建文件夹
        LocalDate currentDate = LocalDate.now();
        String dateFolder = currentDate.toString(); // 格式化为 yyyy-MM-dd
        String targetFolder = reportSC + "/" + dateFolder;
        File dateDirectory = new File(targetFolder);

        // 如果文件夹不存在，则创建
        if (!dateDirectory.exists()) {
            boolean created = dateDirectory.mkdirs();
            if (!created) {
                throw new RuntimeException("无法创建目录: " + targetFolder);
            }
        }
        // 创建目标文件的路径
        String uuIdSc = UUID.randomUUID().toString();
        String newFileName = uuIdSc + ".pdf";

        File targetFile = new File(dateDirectory, newFileName);
        String mergedPdfPath = targetFile.getAbsolutePath(); // 合并后的 PDF 路径

        try {
            mergePDFs(dynamicPdfPath, fixedPdfPath, mergedPdfPath);// 2. 合并动态生成的 PDF 和固定数据的 PDF
        } catch (Exception e) {
            // 记录日志或抛出异常
            throw new RuntimeException("PDF 生成或合并失败: " + e.getMessage(), e);
        }
        String ym ="https://houtaiguanli.yanbeibao2021.com";
        report.setOpenId(dto.getOpenid());
        report.setReportUid(pathMap.get("uuId"));
        report.setReportPath(dynamicPdfPath);
        report.setFileUid(uuIdSc);
        String fwPath= ym+"/file/report/"+dateFolder+"/"+newFileName;
        report.setFilePath(fwPath);//访问地址
        report.setServerName(mergedPdfPath);//服务器存储地址
        report.setRealName("职到了报告");
        reportMapper.insert(report);//添加到报告对象
        return fwPath;
    }

    /**
     * 合并两个 PDF 文件
     */
    public  void mergePDFs(String dynamicPdfPath, String fixedPdfPath, String outputPath) throws IOException, DocumentException {
//        // 创建输出 PDF 文档
//        Document document = new Document();
//        PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPath));
//        document.open();
//
//        // 加载动态生成的 PDF
//        PdfReader dynamicReader = new PdfReader(dynamicPdfPath);
//        int dynamicPageCount = dynamicReader.getNumberOfPages();
//        for (int i = 1; i <= dynamicPageCount; i++) {
//            PdfImportedPage page = copy.getImportedPage(dynamicReader, i);
//            copy.addPage(page);
//        }
//        dynamicReader.close();
//
//        // 加载固定数据的 PDF
//        PdfReader fixedReader = new PdfReader(fixedPdfPath);
//        int fixedPageCount = fixedReader.getNumberOfPages();
//        for (int i = 1; i <= fixedPageCount; i++) {
//            PdfImportedPage page = copy.getImportedPage(fixedReader, i);
//            copy.addPage(page);
//        }
//        fixedReader.close();
//        // 关闭文档
//        document.close();

        // 创建输出 PDF 文档
        Document document = new Document();
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPath));
        document.open();

        // 加载动态生成的 PDF
        PdfReader dynamicReader = new PdfReader(dynamicPdfPath);
        int dynamicPageCount = dynamicReader.getNumberOfPages();
        for (int i = 1; i <= dynamicPageCount; i++) {
            PdfImportedPage page = copy.getImportedPage(dynamicReader, i);
            copy.addPage(page);
        }
        dynamicReader.close();

        // 加载固定数据的 PDF，并添加背景图
        PdfReader fixedReader = new PdfReader(fixedPdfPath);
        int fixedPageCount = fixedReader.getNumberOfPages();
        for (int i = 1; i <= fixedPageCount; i++) {
            PdfImportedPage page = copy.getImportedPage(fixedReader, i);
            copy.addPage(page);

            // 在固定 PDF 页面上添加背景图
            addBackgroundToPage(copy,pictureBj, fixedReader, i);
        }
        fixedReader.close();

        // 关闭文档
        document.close();
    }
    /**
     * 在指定页面上添加背景图片
     */
    private static void addBackgroundToPage(PdfCopy copy, String backgroundImagePath, PdfReader fixedReader, int pageNum) throws IOException, DocumentException {
        // 获取页面尺寸
        Rectangle pageSize = fixedReader.getPageSize(pageNum);

        // 获取 PdfContentByte，用于绘制背景
        PdfContentByte canvas = copy.getDirectContentUnder(); // 通过 getDirectContentUnder 可以保证背景图在内容下方

        // 加载背景图片
        Image backgroundImage = Image.getInstance(backgroundImagePath);
        backgroundImage.setAbsolutePosition(0, 0); // 设置图片的绝对位置
        backgroundImage.scaleToFit(pageSize.getWidth(), pageSize.getHeight()); // 缩放背景图以适应页面大小

        // 在页面底部绘制背景图
        canvas.addImage(backgroundImage);
    }
    //删除报告
    public void deletedReportByOpenId(String openId) {
        // 根据 openId 查找报告记录
        WebReport report = reportMapper.findByOpenId(openId);
        if (report != null) {
            // 获取报告文件的路径
            String filePath = report.getFilePath();
            // 删除服务器上的文件
            if (filePath != null && !filePath.isEmpty()) {
                File file = new File(filePath);
                if (file.exists()) {
                    if (file.delete()) {
                        System.out.println("文件删除成功: " + filePath);
                    } else {
                        System.out.println("文件删除失败: " + filePath);
                    }
                } else {
                    System.out.println("文件不存在: " + filePath);
                }
            }
            String reportPath = report.getReportPath();
            // 删除服务器上的zdy文件
            if (reportPath != null && !reportPath.isEmpty()) {
                File file = new File(reportPath);
                if (file.exists()) {
                    if (file.delete()) {
                        System.out.println("文件删除成功: " + reportPath);
                    } else {
                        System.out.println("文件删除失败: " + reportPath);
                    }
                } else {
                    System.out.println("文件不存在: " + reportPath);
                }
            }
            // 删除数据库中的报告记录
            reportMapper.deleteByOpenId(openId);
            System.out.println("报告记录删除成功: " + openId);
        } else {
            System.out.println("未找到对应的报告记录: " + openId);
        }
    }

    // 生成随机颜色
    private BaseColor getRandomColor() {
        Random random = new Random();
        int r = random.nextInt(256); // 红色分量 (0-255)
        int g = random.nextInt(256); // 绿色分量 (0-255)
        int b = random.nextInt(256); // 蓝色分量 (0-255)
        return new BaseColor(r, g, b);
    }
}
